Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 5f45dbe054b65330d487c2e0774ce853c5cd6a23


Parents : 25208fc
Author : Jeremy O'Brien <neutral@fastmail.com>
Date : 2026-05-20T21:40:48-04:00

Channels: save draft messages on room switch

Changes

1 files changed, 36 insertions(+), 0 deletions(-)


Diff

diff --git a/nomadnet/ui/textui/Channels.py b/nomadnet/ui/textui/Channels.py
index 8668d16..56f4b92 100644
--- a/nomadnet/ui/textui/Channels.py
+++ b/nomadnet/ui/textui/Channels.py
@@ -1281,6 +1281,7 @@ class ChannelsDisplay():
self.users_visible = True
self.channel_list_visible = True
self.collapse_join_part = False
+ self._room_drafts = {}
self._build_listbox()
self.gutter = ChannelsExpandGutter(self.app, self)
@@ -1315,9 +1316,43 @@ class ChannelsDisplay():
self.app.rrc.set_message_callback(self._on_rrc_message)
def _set_right_widget(self, widget):
+ prev = getattr(self, "right", None)
+ if isinstance(prev, RoomWidget) and prev is not widget:
+ self._save_room_draft(prev)
self.right = widget
self._apply_channel_list_visibility(focus_right=True)
+ def _draft_key(self, hub, room):
+ try:
+ return (hub.hub_hash, hub.dest_name, room)
+ except Exception:
+ return None
+
+ def _save_room_draft(self, room_widget):
+ try:
+ key = self._draft_key(room_widget.hub, room_widget.room)
+ if key is None:
+ return
+ text = room_widget.editor.get_edit_text()
+ if text:
+ self._room_drafts[key] = text
+ else:
+ self._room_drafts.pop(key, None)
+ except Exception:
+ pass
+
+ def _restore_room_draft(self, room_widget):
+ try:
+ key = self._draft_key(room_widget.hub, room_widget.room)
+ if key is None:
+ return
+ text = self._room_drafts.get(key)
+ if text:
+ room_widget.editor.set_edit_text(text)
+ room_widget.editor.set_edit_pos(len(text))
+ except Exception:
+ pass
+
def toggle_channel_list(self):
if self.channel_list_visible and self.right is self.placeholder:
return
@@ -1626,6 +1661,7 @@ class ChannelsDisplay():
widget = RoomWidget(self, hub, room)
self.current_room_widget = widget
self._set_right_widget(widget)
+ self._restore_room_draft(widget)
self.columns_widget.focus_position = len(self.columns_widget.contents)-1
self.shortcuts_display = self.room_shortcuts
self.app.ui.main_display.update_active_shortcuts()


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────